package com.taobao.yugong.translator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.sql.DataSource; import org.apache.commons.lang.StringUtils; import org.slf4j.MDC; import com.taobao.yugong.common.YuGongConstants; import com.taobao.yugong.common.model.record.Record; import com.taobao.yugong.common.utils.thread.ExecutorTemplate; import com.taobao.yugong.exception.YuGongException; /** * 允许业务进行回表查询 * * @author agapple 2013-9-12 下午5:38:07 */ public abstract class BackTableDataTranslator extends AbstractDataTranslator implements DataTranslator { /** * 提供源数据库和对应的record * * @param sourceDs * @param record * @return */ public abstract boolean translator(DataSource sourceDs, Record record); public List<Record> translator(final DataSource sourceDs, final DataSource targetDs, final List<Record> records, final ExecutorTemplate template) { final List<Record> result = Collections.synchronizedList(new ArrayList<Record>()); final String spiltKey = MDC.get(YuGongConstants.MDC_TABLE_SHIT_KEY); for (final Record record : records) { if (template != null) { template.submit(new Runnable() { public void run() { String name = Thread.currentThread().getName(); try { MDC.put(YuGongConstants.MDC_TABLE_SHIT_KEY, spiltKey); Thread.currentThread().setName(this.getClass().getSimpleName() + "-" + StringUtils.join(Arrays.asList(record.getSchemaName(), record.getTableName()), '.')); if (translator(sourceDs, record)) { result.add(record); } } catch (Throwable e) { throw new YuGongException("failed record data : " + record.toString(), e); } finally { Thread.currentThread().setName(name); } } }); } else { if (translator(sourceDs, record)) { result.add(record); } } } if (template != null) { // 等待所有结果完成 template.waitForResult(); } return result; } public List<Record> translator(List<Record> records) { throw new UnsupportedOperationException("BackTableDataTranslator Not Support this function"); } }